#ifndef Welcomer_H_
#define Welcomer_H_

#include "../common/Threads/Thread.h"
#include "../common/Sockets/SocketProtocoloPlano.h"
#include "../common/Sockets/ConexionCliente.h"
#include "SpaceBattleInterface.h"
#include <list>
#include "../common/Sockets/ConexionServer.h"
#include "ColaClientes.h"

/*
 *
 * @class Welcomer
 *
 * @brief Clase base para los listener de clientes.
 *
 * Almacena las conexiones establecidas y escucha nuevas.
  */
class Welcomer: public Thread {

private:
	const bool* conexionActiva;

	ColaClientes* clientes;

	//Referencia a la cola de mensajes del servidor
	ColaMensajes* colaMensajesServer;

	//Socket del welcomer
	SocketProtocoloPlano socket;

	//Referencia al game para pasarselo al cliente cuando se inicia
	SpaceBattleInterface* game;

	/*
	 * Puerto donde se hace el listening de clientes
	 */
	int basePort;

	int getNextListenPort();
	int getNextBroadCastPort();

protected:
	virtual void* run();

public:
	/**
	* Constructor
	* @param conexionActiva. Flag del estado del servidor
	* @param puerto. Puerto sobre el que realiza el listen
	* @param maxConexiones. Limite de conexiones que puede realizar sobre ese puerto
	*/
	Welcomer(ColaClientes* clientes,const bool* conexionActiva,SpaceBattleInterface* game,ColaMensajes* colaMensajesServer);

	virtual ~Welcomer();

	/*
	 * inicia el socket
	 */
	void iniciar(const int puerto, const int maxConexiones);

	/*
	 * Cierra el socket
	 * Recorre la lista y termina las conexiones previamente establecidas
	 */
	void terminar();

	bool conectado() const;
};

#endif /* Welcomer_H_ */
